home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / pc / 3DTOSHI2.ZIP / mpg3d / source / G3dgeo.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1996-04-20  |  8.6 KB  |  315 lines

  1.  
  2. // G3DGEO.cpp
  3. //
  4. // Copyright (c) 1996 by Toshiaki Tsuji, all rights reserved.
  5.  
  6. #include "stdgfx.h"
  7. #include "g3dgeo.h"
  8.  
  9. struct GEOFACETYPE
  10.   {
  11.     INT Num;
  12.     INT PointList[16];
  13.   }; // End of GEOFACETYPE
  14.  
  15. G3DGEOTOOL::G3DGEOTOOL () : G3DFILETOOL ()
  16.   {
  17.   } // End of Constructor for G3DGEOTOOL
  18.   
  19. G3DGEOTOOL::~G3DGEOTOOL ()
  20.   {
  21.   } // End of Destructor for G3DGEOTOOL
  22.   
  23. BOOLEAN G3DGEOTOOL::LoadPoints ( FILEHANDLE f, G3DPOLYHEDRON *Object,
  24.                                  LONG NumPoints, double Scale )
  25.   {
  26.     LONG i;
  27.     float x,y,z;
  28.     FLPVECTOR3D *PointList;
  29.     GEOMETRYDATA *GeometryData;
  30.     
  31.     Object->CreateGeometryPoints(NumPoints);
  32.     
  33.     GeometryData = Object->GetGeometryData ();
  34.     PointList = GeometryData->FLPLocalPoints;
  35.  
  36.     if (PointList==NULL)
  37.       return FAILURE;
  38.           
  39.     for (i=0;i<NumPoints;i++)
  40.       {
  41.         fscanf ( f, "%f %f %f\n", &x, &y, &z );
  42.         PointList[i].x = (float)(x*Scale);
  43.         PointList[i].y = (float)(y*Scale);
  44.         PointList[i].z = (float)(z*Scale);
  45.       } // End for
  46.       
  47.     return SUCCESS;  
  48.   } // End of LoadPoints for G3DGEOTOOL                                 
  49.                                  
  50. BOOLEAN G3DGEOTOOL::LoadFaces ( FILEHANDLE f, G3DPOLYHEDRON *Object )
  51.   {
  52.     G3DPOLY *PolyList;
  53.     GEOMETRYDATA *GeometryData;
  54.     LONG NewFaceNum;
  55.  
  56.     BOOLEAN Done=FALSE;
  57.     INT NumPoints;
  58.     INT Dummy;
  59.     CHAR DummyChar;
  60.     LONG NumFaces;
  61.     
  62.     NewFaceNum = NumFaces = 0;
  63.     if (NumFaces)
  64.       {}  
  65.     
  66.     GEOFACETYPE *Faces;
  67.  
  68.     INT i,j;
  69.     LONG Position;
  70.  
  71.     Position = File.GetPos ( f );
  72.  
  73.     while (!Done)
  74.       {
  75.         if (fscanf(f,"%d",&NumPoints)==EOF)
  76.           Done = TRUE;
  77.         else 
  78.           {
  79.             DummyChar = (CHAR)File.GetCh ( f );
  80.             while (DummyChar==' ')
  81.               DummyChar = (CHAR)File.GetCh ( f );
  82.             if (DummyChar==EOF)
  83.               Done = TRUE;
  84.  
  85.             if ((DummyChar>='0')&&(DummyChar<='9')&&(NumPoints>=3))
  86.               {
  87.                 File.Seek ( f, -1, FROM_CURRENT );
  88.                 for (j=0;j<NumPoints;j++)
  89.                   {
  90.                     if (fscanf ( f, "%d ", &Dummy )==EOF)
  91.                       return FAILURE;
  92.                   } // End for
  93.                 fscanf ( f, "%d\n", &Dummy );
  94.                 NumFaces++;  
  95.               } // End if
  96.             else
  97.               {
  98.                 DummyChar = (CHAR)File.GetCh ( f );
  99.                 while ((DummyChar!='\n')&&(DummyChar!=EOF))
  100.                   DummyChar = (CHAR)File.GetCh ( f );
  101.                 if (DummyChar==EOF)
  102.                   {
  103.                     delete Faces;
  104.                     return FAILURE;
  105.                   } // End if
  106.               } // End else
  107.           } // End else  
  108.       } // End while
  109.     
  110.     File.Seek ( f, Position, FROM_BEGIN );
  111.  
  112.     Done = FALSE;
  113.     Faces = new GEOFACETYPE [NumFaces];
  114.     if (Faces==NULL)
  115.       return FAILURE;
  116.  
  117.     i = 0;
  118.     while ((i<NumFaces)&&(!Done))
  119.       {
  120.         if (fscanf(f,"%d",&NumPoints)==EOF)
  121.           {
  122.             delete Faces;
  123.             return FAILURE;
  124.           } // End if
  125.         else 
  126.           {
  127.             DummyChar = (CHAR)File.GetCh ( f );
  128.             while (DummyChar==' ')
  129.               DummyChar = (CHAR)File.GetCh ( f );
  130.             if (DummyChar==EOF)
  131.               {
  132.                 delete Faces;
  133.                 return FAILURE;
  134.               } // End if
  135.  
  136.             if ((DummyChar>='0')&&(DummyChar<='9')&&(NumPoints>=3))
  137.               {
  138.                 File.Seek ( f, -1, FROM_CURRENT );
  139.                 Faces[i].Num = NumPoints;
  140.                 for (j=0;j<Faces[i].Num;j++)
  141.                   {
  142.                     fscanf ( f, "%d ", &(Faces[i].PointList[j]) );
  143.                   } // End for
  144.                 fscanf ( f, "%d\n", &Dummy );
  145.                 NewFaceNum+=1+Faces[i].Num-3;
  146.                 i++;
  147.               } // End if
  148.             else
  149.               {
  150.                 DummyChar = (CHAR)File.GetCh ( f );
  151.                 while ((DummyChar!='\n')&&(DummyChar!=EOF))
  152.                   DummyChar = (CHAR)File.GetCh ( f );
  153.                 if (DummyChar==EOF)
  154.                   {
  155.                     delete Faces;
  156.                     return FAILURE;
  157.                   } // End if
  158.               } // End else
  159.           } // End else  
  160.       } // End while
  161.     
  162.     Object->CreateGeometryPolys ( NewFaceNum );
  163.       
  164.     GeometryData = Object->GetGeometryData ();
  165.     PolyList = GeometryData->Polys;
  166.       
  167.     if (PolyList==NULL)  
  168.       {
  169.         delete Faces;
  170.         return FAILURE;
  171.       } // End if  
  172.       
  173.     for (i=0;i<NumFaces;i++)
  174.       {
  175.         for (j=2;j<Faces[i].Num;j++)
  176.           {
  177.             PolyList->Points[0] = Faces[i].PointList[0];
  178.             PolyList->Points[1] = Faces[i].PointList[j];
  179.             PolyList->Points[2] = Faces[i].PointList[j-1];  // make it counter clockwise
  180.             PolyList->TexCoords[0].x = (float)0; PolyList->TexCoords[0].y = (float)0;
  181.             PolyList->TexCoords[1].x = (float)0; PolyList->TexCoords[1].y = (float)0;
  182.             PolyList->TexCoords[2].x = (float)0; PolyList->TexCoords[2].y = (float)0;
  183.             PolyList++;
  184.           } // End if
  185.       } // End while
  186.  
  187.     delete Faces;
  188.  
  189.     return SUCCESS;      
  190.   } // End of LoadFaces for G3DGEOTOOL                                
  191.                                 
  192. BOOLEAN G3DGEOTOOL::Load ( FILEHANDLE f, LINKEDLIST<G3DOBJECT*> *ObjectList,
  193.                            BOOLEAN ClockWise, double Scale )
  194.   {
  195.     INT NumPoints;
  196.     CHAR IDStr[4];
  197.     
  198.     fscanf ( f, "%s\n", IDStr );
  199.     
  200.     if (strncmp(IDStr,"3DG1",4)!=0)
  201.       return FAILURE;
  202.       
  203.     fscanf ( f, "%d\n", &NumPoints );
  204.     
  205.     G3DPOLYHEDRON *Object = new G3DPOLYHEDRON ();
  206.     if (Object==NULL)
  207.       return FAILURE;
  208.       
  209.     Object->TextureMapped = FALSE;
  210.     
  211.     if (LoadPoints ( f, Object, NumPoints, Scale )==FAILURE)
  212.       {
  213.         delete Object;
  214.         return FAILURE;
  215.       } // End if
  216.       
  217.     if (LoadFaces ( f, Object )==FAILURE)
  218.       {
  219.         delete Object;
  220.         return FAILURE;
  221.       } // End if
  222.     
  223.     Object->ClockWised = ClockWise;
  224.     ObjectList->AddObject ( Object );  
  225.     return SUCCESS;
  226.   } // End of Load for G3DGEOTOOL
  227.   
  228. BOOLEAN G3DGEOTOOL::SavePoints ( FILEHANDLE f, G3DPOLYHEDRON *Object,
  229.                                  LONG NumPoints, double Scale )
  230.   {
  231.     LONG i;
  232.     float x,y,z;
  233.     FLPVECTOR3D *PointList;
  234.     GEOMETRYDATA *GeometryData;
  235.     
  236.     GeometryData = Object->GetGeometryData ();
  237.     PointList = GeometryData->FLPLocalPoints;
  238.  
  239.     if (PointList==NULL)
  240.       return FAILURE;
  241.           
  242.     for (i=0;i<NumPoints;i++)
  243.       {
  244.         x = (float)(PointList[i].x*Scale);
  245.         y = (float)(PointList[i].y*Scale);
  246.         z = (float)(PointList[i].z*Scale);
  247.         fprintf ( f, "%f %f %f\n", x, y, z );
  248.       } // End for
  249.       
  250.     return SUCCESS;  
  251.   } // End of SavePoints for G3DGEOTOOL
  252.                                  
  253. BOOLEAN G3DGEOTOOL::SaveFaces ( FILEHANDLE f, G3DPOLYHEDRON *Object )
  254.   {
  255.     LONG i;
  256.     INT P1,P2,P3;
  257.     G3DPOLY *PolyList;
  258.     GEOMETRYDATA *GeometryData;
  259.     LONG NumPolys;
  260.     
  261.     GeometryData = Object->GetGeometryData ();
  262.     PolyList = GeometryData->Polys;
  263.     NumPolys = GeometryData->NumPolys;
  264.  
  265.     if (PolyList==NULL)
  266.       return FAILURE;
  267.           
  268.     for (i=0;i<NumPolys;i++)
  269.       {
  270.         P1 = PolyList[i].Points[0];  
  271.         P2 = PolyList[i].Points[1];  
  272.         P3 = PolyList[i].Points[2];  
  273.         fprintf ( f, "3 %d %d %d 15\n", P1, P2, P3 );
  274.       } // End for
  275.       
  276.     return SUCCESS;  
  277.   } // End of SaveFaces for G3DGEOTOOL
  278.                                  
  279. BOOLEAN G3DGEOTOOL::Save ( FILEHANDLE f, LINKEDLIST<G3DOBJECT*> *ObjectList,
  280.                            BOOLEAN ClockWise, double Scale )
  281.   {
  282.     INT NumPoints;
  283.     CHAR IDStr[5];
  284.  
  285.     LISTOBJECT<G3DOBJECT*> *ObjectNode = ObjectList->GetHead();
  286.     if (ObjectNode==NULL)
  287.       return FAILURE;
  288.       
  289.     G3DPOLYHEDRON *Object = (G3DPOLYHEDRON*)(ObjectNode->Data);
  290.     if (Object==NULL)
  291.       return FAILURE;
  292.  
  293.     GEOMETRYDATA *GeometryData = Object->GetGeometryData ();
  294.     NumPoints = GeometryData->NumPoints;
  295.     
  296.     strcpy ( IDStr, "3DG1" );
  297.     fprintf ( f, "%s\n", IDStr );          
  298.     fprintf ( f, "%d\n", NumPoints );
  299.     
  300.     if (SavePoints ( f, Object, NumPoints, Scale )==FAILURE)
  301.       {
  302.         return FAILURE;
  303.       } // End if
  304.       
  305.     if (SaveFaces ( f, Object )==FAILURE)
  306.       {
  307.         return FAILURE;
  308.       } // End if
  309.  
  310.     if (ClockWise)
  311.       {}  
  312.     return SUCCESS;
  313.   } // End of Save for G3DGEOTOOL 
  314.  
  315.